package com.toft.widgets.workflow.service;

import java.util.List;
import java.util.Map;

import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.task.Task;

import com.toft.widgets.workflow.model.Page;
import com.toft.widgets.workflow.model.TaskItem;
import com.toft.widgets.workflow.model.WorkflowUser;

/**
 * 流程查询服务接口
 * 
 * @author 邹庆林
 * @version 1.0
 */
public interface IWorkflowQueryService {

	/**
	 * 根据流程定义标识来查找特定流程定义
	 * 
	 * @param processDefinitionId
	 *            流程定义唯一标识
	 * @return 流程定义
	 */
	ProcessDefinition findProcessDefintionById(String processDefinitionId);

	/**
	 * 根据流程实例Id来查找流程实例，流程实例可以转换成Execution接口
	 * 
	 * @param processInstanceId
	 *            流程实例Id
	 * @return 流程实例
	 */
	ProcessInstance findProcessInstanceById(String processInstanceId);

	/**
	 * 按条件查询流程实例
	 * 
	 * @param taskitem
	 * @return
	 */

	List searchProcessInstances(TaskItem taskitem);

	/**
	 * 查找所有的流程实例
	 * 
	 * @return 流程实例列表，列表元素是流程实例
	 */
	Page searchProcessInstances(TaskItem taskItem, Page page);

	/**
	 * 获取动态任务
	 * 
	 * @param taskId
	 *            动态任务所附属任务Id
	 * @return 动态任务列表，列表元素是具体任务
	 * @see org.jbpm.pvm.internal.task.TaskImpl
	 */
	List searchDynamicTasks(String taskId);

	/**
	 * 列出用户的待办任务
	 * 
	 * @param userCode
	 *            用户标识
	 * @return 待办任务列表，列表元素是任务实例
	 * @see org.jbpm.pvm.internal.task.TaskImpl
	 */
	List findPersonalTaskForWaiting(String userCode);

	/**
	 * 列出用户的待办任务
	 * 
	 * @param userCode
	 *            用户标识
	 * @param taskItem
	 *            任务对象
	 * @return 待办任务列表，列表元素是任务实例
	 * @see org.jbpm.pvm.internal.task.TaskImpl
	 */
	List findPersonalTaskForWaiting(String userCode, TaskItem taskItem);

	/**
	 * 列出用户的组任务
	 * 
	 * @param wfUser
	 *            用户标识
	 * @return 组任务列表，列表元素是任务实例
	 * @see org.jbpm.pvm.internal.task.TaskImpl
	 */
	List findGroupTaskForWaiting(WorkflowUser wfUser);

	/**
	 * 列出用户的组任务
	 * 
	 * @param wfUser
	 *            用户标识
	 * @param taskItem
	 *            任务对象
	 * @return 组任务列表，列表元素是任务实例
	 * @see org.jbpm.pvm.internal.task.TaskImpl
	 */
	List findGroupTaskForWaiting(WorkflowUser wfUser, TaskItem taskItem);

	/**
	 * 列出用户的待办任务
	 * 
	 * @param userCode
	 *            用户标识
	 * @param taskItem
	 *            任务对象
	 * @return 待办任务列表，列表元素是任务实例
	 * @see org.jbpm.pvm.internal.task.TaskImpl
	 */
	Page findAllTaskList(String userCode, TaskItem taskItem, Page page);

	/**
	 * 列出用户已办任务
	 * 
	 * @param userCode
	 *            用户标识
	 * @return 已办任务列表，列表元素是历史任务
	 * @see org.jbpm.pvm.internal.history.model.HistoryTaskImpl
	 */

	List findHistoryTasks(TaskItem taskItem);
	/**
	 * 列出用户的已办任务
	 * 
	 * @param userCode
	 *            用户标识
	 * @param taskItem
	 *            任务对象
	 * @return 已办任务列表，列表元素是任务实例
	 * @see org.jbpm.pvm.internal.history.model.HistoryTaskImpl
	 */
	Page findHistoryTasks(String userCode, TaskItem taskItem, Page page);

	/**
	 * 获取任务
	 * 
	 * @param taskId
	 *            任务唯一标识
	 * @return 具体任务
	 */
	Task getTask(String taskId);

	/**
	 * 获取指定任务的所有流向
	 * 
	 * @param taskId
	 *            任务Id
	 * @return 流向列表，列表元素是任务流向对象TransitionImpl
	 */
	List getTaskTransitions(String taskId);

	/**
	 * 获取指定任务的变量
	 * 
	 * @param taskId
	 *            任务标识
	 * @return java.util.Map类型的变量
	 */
	Map getTaskVariable(String taskId);

	/**
	 * 根据流程实例标识获取流程定义内容
	 * 
	 * @param processInstanceId
	 *            流程实例标识
	 * @return 返回流程定义内容
	 */
	String getProcessDefinitionByProcessInstanceId(String processInstanceId);

	/**
	 * 查看流程
	 * 
	 * @param processInstanceId
	 *            流程实例标识
	 * @return 流程信息
	 */
	Object viewProcessInfoDuplication(String processInstanceId);

	/**
	 * 获取流程实例的状态
	 * 
	 * @param processInstanceId
	 *            流程实例标识
	 * @return 流程实例的状态
	 */
	String getProcessInstanceState(String processInstanceId);

	/**
	 * 获取流程定义的状态
	 * 
	 * @param processDefinitionId
	 *            流程定义标识
	 * @return 流程定义的状态
	 */
	String getProcessDefinitionState(String processDefinitionId);

	/**
	 * 根据任务标识来获取流程实例的状态
	 * 
	 * @param taskId
	 *            任务标识
	 * @return ended:结束 active:未结束 suspend:挂起
	 */
	String getProcessInstanceStateByTaskId(String taskId);

	/**
	 * 根据流程实例ID获取流程是否结束
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @return
	 */
	public boolean isEndedByProcessInstanceId(String processInstanceId);

	/**
	 * 完成提交节点（即普通任务节点） 如果提交节点是第一次创建，就自动完成， 否则就不自动完成，需要提交人手动完成任务
	 * 
	 * @param processInstanceId
	 *            流程实例标识
	 * @param userCode
	 *            用户code
	 * @return 任务的下一级处理人
	 */
	List completeSubmitActivity(String processInstanceId, String userCode);

	/**
	 * 通过任务实例的标识获取组标识
	 * 
	 * @param taskId
	 *            任务标识
	 * @return 返回组标识，任务是组任务就返回组标识，否则返回空字符串
	 */
	String getGroupIdByTaskId(String taskId);

	String getNextOperatorsByTaskId(String taskId);

	/**
	 * 获取任务的下一级处理人(在完成任务后调用该方法)
	 * 
	 * @param taskId
	 *            任务标识
	 * @return 任务的下一级处理人
	 */
	List getNextOperatorsListByTaskId(String taskId);

	String getNextOperatorsByProcessInstanceId(String processInstanceId);

	/**
	 * 获取任务的下一级处理人(在完成任务后调用该方法)
	 * 
	 * @param processInstanceId
	 *            流程实例标识
	 * @return 任务的下一级处理人
	 */
	List getNextOperatorsListByProcessInstanceId(String processInstanceId);

	/**
	 * 获取流程历史信息
	 * 
	 * @param taskId
	 * @return 历史流程信息
	 */
	List getProcessHistoryInfosByTaskId(String taskId);

	/**
	 * 获取流程历史信息 by chenggang isNeedSubmitActivity 是否需要显示提交记录
	 * 
	 * @param taskId
	 * @param isNeedSubmitActivity
	 * @return
	 */
	List getProcessHistoryInfosByTaskId(String taskId, boolean isNeedSubmitActivity);

	/**
	 * 获取审批时流程所走的流向
	 * 
	 * @param taskId
	 * @param approveType
	 * @return 流向标识
	 */
	String getTaskTransition(String taskId, String approveType);

	/**
	 * 获取“再次提交”的流向名称
	 * 
	 * @param taskId
	 * @return 流向标识
	 */
	String getTaskTransitionByActivityName(String taskId);

	/**
	 * 获取节点中文名
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @return 节点中文名称
	 */
	String getActivityNameByProcessInstanceId(String processInstanceId);

	/**
	 * 根据流程实例ID获取历史流程信息
	 * 
	 * @param processInstanceId
	 *            流程实例ID
	 * @return 历史流程信息
	 */
	List getProcessHistoryInfosByProcessInstanceId(String processInstanceId);

	/**
	 * 根据流程实例ID获取历史流程信息 by chenggang isNeedSubmitActivity 是否需要显示提交记录
	 * 
	 * @param processInstanceId
	 * @param isNeedSubmitActivity
	 * @return
	 */
	List getProcessHistoryInfosByProcessInstanceId(String processInstanceId, boolean isNeedSubmitActivity);

	List getOutgoingTransitionsByTaskId(String taskId);

	/**
	 * 根据流程实例ID获取待办任务
	 * 
	 * @param processInstanceId
	 * @return
	 */
	List findTaskListByProcessInstanceId(String processInstanceId);

	List findTaskListByProcessInstanceId(TaskItem taskItem);
	
	String getEndTransitionByTaskId(String taskId);

	/**
	 * 
	 * @param taskId
	 * @param key
	 * @return
	 */
	String getAssignRuleByProcessDefine(String taskId, String key);

	/**
	 * 
	 * @param taskId
	 * @return
	 */
	boolean isEndedByProcessDefine(String taskId);
}
